package com.jt.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.jt.mapper.ItemCatMapper;
import com.jt.pojo.ItemCat;
import com.jt.service.ItemCatService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

@Service
public class ItemCatServiceImpl implements ItemCatService {
    @Autowired
    private ItemCatMapper itemCatMapper;

    /**
     * 1.准备Map集合,实现数据封装
     * Map<key,value> = Map<parentId,List<ItemCat>>
     * 2.封装业务说明
     * map中key~~parentId
     * 不存在:可以存储该key
     * 同时封装一个List集合,将自己作为第一个元素封装到其中.
     * 存在: 根据key获取所有子级集合,将自己追加进去 形成第二个元素.
     */

    public Map<Integer, List<ItemCat>> itemCatMap() {
        //1.定义Map集合
        Map<Integer, List<ItemCat>> map = new HashMap<>();
        //2.查询所有的数据库信息 1-2-3
        List<ItemCat> list = itemCatMapper.selectList(null);
        for (ItemCat itemCat : list) {
            int parentId = itemCat.getParentId();//获取父级ID
            if (map.containsKey(parentId)) { //判断集合中是否已经有parentId
                //有key  获取list集合 将自己追加到集合中
                List<ItemCat> exeList = map.get(parentId);//引用对象
                exeList.add(itemCat);
            } else {
                //没有key,将自己封装为第一个list元素
                List<ItemCat> firstList = new ArrayList<>();
                firstList.add(itemCat);
                map.put(parentId, firstList);
            }
        }
        return map;
    }

    @Override
    public List<ItemCat> findItemCatList(Integer level) {
        long startTime = System.currentTimeMillis();
        Map<Integer, List<ItemCat>> map = itemCatMap();
        //1.如果level=1 说明获取一级商品分类信息 parent_id=0
        if (level == 1) {
            return map.get(0);
        }

        if (level == 2) { //获取一级和二级菜单信息
            return getTwoList(map);
        }

        //3.获取三级菜单信息
        //3.1获取二级商品分类信息  BUG:有的数据可能没有子级 如何处理
        List<ItemCat> oneList = getTwoList(map);
        for (ItemCat oneItemCat : oneList) {
            //从一级集合中,获取二级菜单列表
            List<ItemCat> twoList = oneItemCat.getChildren();
            //bug解决: 如果该元素没有2级列表,则跳过本次循环,执行下一次操作
            if (twoList == null || twoList.size() == 0) {
                continue;
            }
            for (ItemCat twoItemCat : twoList) {
                //查询三级商品分类  条件:parentId=2级ID
                List<ItemCat> threeList = map.get(twoItemCat.getId());
                twoItemCat.setChildren(threeList);
            }
        }
        long endTime = System.currentTimeMillis();
        System.out.println("耗时:" + (endTime - startTime) + "毫秒");//耗时:28毫秒
        return oneList;
    }

    public List<ItemCat> getTwoList(Map<Integer, List<ItemCat>> map) {
        List<ItemCat> oneList = map.get(0);
        for (ItemCat oneItemCat : oneList) {//查询二级 parentId=1级Id
            List<ItemCat> twoList = map.get(oneItemCat.getId());
            oneItemCat.setChildren(twoList);
        }
        //二级嵌套在一级集合中,所有永远返回的都是1级.
        return oneList;
    }

    @Override
    @Transactional
    public void updateStatus(ItemCat itemCat) {
        itemCatMapper.updateById(itemCat);
    }

    @Override
    @Transactional
    public void save(ItemCat itemCat) {
        itemCat.setStatus(true);
        itemCatMapper.insert(itemCat);
    }

    @Override
    @Transactional
    public void updateItemCat(ItemCat itemCat) {
        itemCatMapper.updateById(itemCat);
    }

    @Override
    public void deleteItemCat(ItemCat itemCat) {
        if (itemCat.getLevel() == 3) {
            itemCatMapper.deleteById(itemCat);
            return;
        }
        //删除二级对象-- 通过  三级对象的parent_id = 二级的id 来删除三级对象 然后删除二级对象
        if (itemCat.getLevel() == 2) {
            itemCatMapper.delete(new QueryWrapper<ItemCat>().eq("parent_id", itemCat.getId()));
            itemCatMapper.deleteById(itemCat);
            return;
        }
        //删除一级--先遍历二级对象，通过二级对象删除三级--然后删除二级 一级
        QueryWrapper<ItemCat> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("parent_id", itemCat.getId());
        List<ItemCat> itemCatList = itemCatMapper.selectList(queryWrapper);
        for (ItemCat L2 : itemCatList){
            queryWrapper.clear();
            itemCatMapper.delete(queryWrapper.eq("parent_id", L2.getId()));
            itemCatMapper.deleteById(L2);
        }
//        List<ItemCat> itemCatList = itemCatMapper.selectList(new QueryWrapper<ItemCat>().eq("parent_id", itemCat.getId()));
//        for (ItemCat l3 : itemCatList) {
//            itemCatMapper.delete(new QueryWrapper<ItemCat>().eq("parent_id", l3.getId()));
//        }
//        itemCatMapper.selectList(
//                new QueryWrapper<ItemCat>().eq("parent_id", itemCat.getId()))
//                .forEach(x -> itemCatMapper.delete(
//                        new QueryWrapper<ItemCat>().eq("parent_id", x.getId())));
        itemCatMapper.deleteById(itemCat);
    }



    /**
     * 3层商品分类嵌套  1一级分类(children(2级商品分类))
     *                2一级分类(children(3级商品分类))
     * 一级查询条件   parent_id=0
     * 二级查询条件   parent_id=一级的ID
     * 三级查询条件   parent_id=二级的ID
     * @param level
     * @return
     */
//    @Override
//    public List<ItemCat> findItemCatList(Integer level) {
//        long startTime = System.currentTimeMillis();
//        QueryWrapper<ItemCat> itemCatQueryWrapper = new QueryWrapper<>();
//        itemCatQueryWrapper.eq("parent_id", 0);
//        List<ItemCat> oneList = itemCatMapper.selectList(itemCatQueryWrapper);
//        for (ItemCat oneItemCat : oneList) {
//            itemCatQueryWrapper.clear();
//            itemCatQueryWrapper.eq("parent_id", oneItemCat.getId());
//            List<ItemCat> twoList = itemCatMapper.selectList(itemCatQueryWrapper);
//            for (ItemCat twoItemCat : twoList) {
//                itemCatQueryWrapper.clear();
//                itemCatQueryWrapper.eq("parent_id", twoItemCat.getId());
//                List<ItemCat> threeList = itemCatMapper.selectList(itemCatQueryWrapper);
//                twoItemCat.setChildren(threeList);
//            }
//            oneItemCat.setChildren(twoList);
//        }
//        long endTime = System.currentTimeMillis();
//        System.out.println("执行时间为：" + (endTime - startTime) + "毫秒");//执行时间为：248毫秒
//        return oneList;
//    }
}
